package com.dongdongshop.service.impl;


import com.dongdongshop.api.GoodsServiceApi;
import com.dongdongshop.data.Result;
import com.dongdongshop.dto.ItemDto;
import com.dongdongshop.service.CartService;
import com.dongdongshop.vo.CartDeailVo;
import com.dongdongshop.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class CartServiceImpl implements CartService {

    @Qualifier("redisTemplate")
    @Autowired
    private RedisTemplate redis;
    @Autowired
    private GoodsServiceApi gs;

    //添加购物车

    @Override
    public void addCart(String userId, Long itemId, Integer num) {
        // 1, 首先 从redis中获取登录用户的购物车数据
        List<CartVo> redisList = getCartListFromRedis(userId);
        // 2, 根据商品Id去查询商品的数据
        Result<ItemDto> result = gs.getItem(itemId);
//                if (result.getCode()!=99999){   //如果调用的结果是错误的,那么整个接口的功能都是不对的
//            throw new RuntimeException("触发降级,goods服务不会对cart服务造成影响");
//        }
        ItemDto itemDto = result.getData();
        // 3, 根据商品的数据获取商家的Id
        String sellerId = itemDto.getSellerId();
        // 4, 判断redis中的购物车有没有该商家的id
        CartVo vo = null;
        for (CartVo cartVo : redisList) {
            if (Objects.equals(cartVo.getSellerId(),sellerId)){
                vo = cartVo;
                break;
            }
        }
        // 5, 没有 , 说明我们之前的购物车没有这个商家的商品
            //我们就需要创建购物车队形,并且追加到list中,然后再存入redis中
        if (vo == null){
            vo = new CartVo();
            //存入商家Id
            vo.setSellerId(sellerId);
            //创建明细列表
            List<CartDeailVo> cartDeailVoList = new ArrayList<>();
            //创建明细对象
            CartDeailVo deailVo = new CartDeailVo();
            deailVo.setGoodsId(itemDto.getGoodsId()); //SPU  id
            deailVo.setItemId(itemDto.getId());      //SKU   id
            deailVo.setNum(num);        //购买数量
            deailVo.setTitle(itemDto.getTitle()); //商品名
            deailVo.setPicPath(itemDto.getImage());  //商品图片
            deailVo.setPrice(itemDto.getPrice());  //商品的单价
            deailVo.setTitle(itemDto.getTitle()); //商品名
            deailVo.setTotalFee(new BigDecimal(deailVo.getPrice().doubleValue() * num)); //总价 = 单价 * 数量
            cartDeailVoList.add(deailVo);   //将明细放到明细列表中
            vo.setDetaillist(cartDeailVoList);  //将明细列表放入购物车中
            redisList.add(vo); //新添加的购物车放入老的购物车中
        } else { // 6, 有 , 说明我们之前购物买过这个商家的商品
            // 7, 判断有没有购买货该商品
            List<CartDeailVo> detaillist = vo.getDetaillist();
            CartDeailVo deail = null;
            for (CartDeailVo deailVo : detaillist) {
                if (Objects.equals(deailVo.getItemId(),itemDto.getId())){
                    deail = deailVo;
                    break;
                }
            }
            if (deail == null){
                // 8, 没有买过,新建追加进去
                deail = new CartDeailVo();
                deail.setGoodsId(itemDto.getGoodsId()); //SPU  id
                deail.setItemId(itemDto.getId());      //SKU   id
                deail.setNum(num);        //购买数量
                deail.setTitle(itemDto.getTitle()); //商品名
                deail.setPicPath(itemDto.getImage());  //商品图片
                deail.setPrice(itemDto.getPrice());  //商品的单价
                deail.setTitle(itemDto.getTitle()); //商品名
                deail.setTotalFee(new BigDecimal(deail.getPrice().doubleValue() * num)); //总价 = 单价 * 数量
                //将购物车明细数据放入到明细列表中
                detaillist.add(deail);
            } else {
                // 9, 数量+num 价格 加过的总数量 * 单价
                //买过这个商家的这个商品
                deail.setNum(deail.getNum() + num); // 修改总数量
                deail.setTotalFee(new BigDecimal(deail.getPrice().doubleValue() * deail.getNum())); //修改价格
                //如果该商品我们删除,设置num为0或者小于0的时候,我们需要将当前商品从购物车明细列表中删除

                if (deail.getNum() <= 0){
                    detaillist.remove(deail);
                }
                //如果我们的明细列表删完了,说明该商家也不应该存在了
                if (detaillist.size() == 0){
                    redisList.remove(vo);
                }

            }
        }
        //存入Redis中
        setCartListToRedis(userId,redisList);
    }

    //从redis中获取List数据
    @Override
    public List<CartVo> getCartListFromRedis(String userId) {
        List<CartVo> cartList = (List<CartVo>) redis.boundHashOps("cartList").get(userId);
        //防止空指针
        if (cartList == null){
            cartList = new ArrayList<>();
        }
        return cartList;
    }

    //存入到redis中
    public void setCartListToRedis(String userId,List<CartVo> cartVoList) {
        redis.boundHashOps("cartList").put(userId,cartVoList);
    }
}

